#!/bin/bash
source ./common.sh


# 功能说明
echo    "功能说明：基于使用分支，打上日常部署的标签版本号"
echo "1. 只负责创建基于使用分支创建标签名称，不会针对分支进行删除、新建"
echo "2. 注意：如果标签已经存在，那么会记录标签信息，然后删除标签，重新打上标签"
# 打印空行
echo -e '\n'

# ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

module_array=(${module_name_list})

# 根据配置信息生成gitlab的源代码克隆地址
module_name_list_size=${#module_array[*]}
echo -e "Hello，您本次操作了"${module_name_list_size}"个服务\n"

int=0
while(( $int < ${module_name_list_size}))
do    
    # 创建当前git项目的父级临时目录tmp，存放项目信息
    module_name=${module_array[$int]}
    module_folder_name=${MODULE_ID}-${module_name}

    code_url=http://${SOURCE_CODE_SERVER}/${GITLAB_GROUP_NAME}/${module_folder_name}.git
    echo "开始生成第"$(expr ${int} + 1)"个，服务名：${module_array[$int]}, 源代码地址："${code_url}
    let "int++"


    # 根据固定规则生成代码分支名称,分支名称后缀branch 
    echo "根据固定规则构造标签名称：项目名称-服务名称-分支名称-版本计数器"
    use_branch_name=${MODULE_ID}"-"${module_name}-${USE_BRANCH_VERSION}
    next_tag_name=${MODULE_ID}"-"${module_name}-$USE_BRANCH_VERSION"-"${VERSION_COUNT}
    # 生成上一次标签版本号
    previous_tag_name=${MODULE_ID}"-"${module_name}-$USE_BRANCH_VERSION"-"`expr $VERSION_COUNT - 1`
    echo "      新的标签名称："${next_tag_name}
    
    if [ ${VERSION_COUNT} -gt 1 ]
    then
        echo "      上一次的标签名称："${previous_tag_name}
    fi
    
    echo -e '\n'

    #  开始管理标签、分支
    # git文件夹是否存在
    dirPath="${PROJECT_PATH}/project/${module_folder_name}"

    if [ -d ${dirPath} ]
    then
        echo "${module_folder_name}目录存在，校验通过"
    else
        echo ${module_folder_name}"目录不存在，即将克隆代码并创建目录"
        # 将克隆的代码统一放到一个目录下
        cd ${PROJECT_PATH}/project
        git clone ${code_url}
        # 目录第二次校验，避免git地址错误造成创建临时文件夹
        if [ -d ${dirPath} ]
        then
            echo "目录第二次校验，${module_folder_name}目录存在，校验通过"
        else
            echo ${module_folder_name}"目录不存在，跳出循环！！！"
            # 打印空行，分割模块
            echo -e '----------------------------------------------------------------------------------------------------------------------------------------\n'
            continue
        fi
    fi
    
    echo "进入模块目录： "${dirPath}
    cd ${dirPath}

    # 创建临时文件夹，存放项目信息
    module_tmp_dir="../tmp/${module_name}"
    mkdir -p ${module_tmp_dir}

    # 克隆代码后，到远程仓库中拉取所有你本地仓库中还没有的数据
    git fetch
    
    # 切换分支，开始打标签
    # 根据当前标记的标签版本号，反推出上一次的标签号
    echo -e "给指定分支"${use_branch_name}"打标签 开始\n"
    echo "      准备切换至分支："${use_branch_name}

    # 切换到主分支，避免罗列所有分支时，使用分支前出现星号*
    git co master

    #创建临时文件
    branch_exist_validate="branch_exist_validate.tmp"

    # 将git br --list|grep $1 写入文件
    # 获取分支名称,并过滤出当前使用分支

    # 构造远程分支名称
    remote_branch_name="remotes/origin/"${use_branch_name}

    # 其中-d代表用什么进行分割，-f 2代表要第2个结果 
    git br -a|grep ${remote_branch_name} | cut -d "/" -f 3 > ${module_tmp_dir}/${branch_exist_validate} 

    # 读取临时文件,去除*号，获取分支名称
    #branch_read_name=$(grep -w " ${use_branch_name}" ${module_tmp_dir}/${branch_exist_validate})
    branch_read_name=$(awk '{print $1}' ${module_tmp_dir}/${branch_exist_validate})

    if [[ ! ${USE_BRANCH_VERSION} = "master" ]]
    then
        echo "获取远程分支名称： "${branch_read_name}

        # 建立远程跟踪分支,并切换到使用分支
        if [ ${branch_read_name} ]
        then
            #  1.6.2 以上版本的 Git,可以用 --track 选项简化
            git co --track origin/${use_branch_name}
            git co ${use_branch_name}
        else
            echo "使用分支${use_branch_name}不存在，请先执行创建分支脚本,跳出循环！！！"
            # 打印空行，分割模块
            echo -e '----------------------------------------------------------------------------------------------------------------------------------------\n'
            continue
        fi
    else
        use_branch_name=${USE_BRANCH_VERSION}
    fi    

    echo "      切换分支成功"${use_branch_name}

    echo -e "\n本地分支列表"
    git br --list

    # 抓取当前分支数据下来，然后将远端分支自动合并到本地仓库中当前分支
    echo "抓取当前分支数据下来，然后将远端分支自动合并到本地仓库中当前分支"
    git pull

    # 校验：如果标签已经存在，那么记录标签信息，然后删除标签，重新打上标签
    # 获取指定模块下的所有标签名称，并写入文件，便于版本管控
     git tag --list "${MODULE_ID}*" > ${module_tmp_dir}/tag_list_all.info
     # 判断标签是否存在，如果存在，获取提交信息，并保存，然后删除标签，重新打上新的标签；
     # 如果不存在，打上新的标签并推送
    is_tag=$(grep "${next_tag_name}" ${module_tmp_dir}/tag_list_all.info)
    if [[ ${is_tag} ]]; then
        echo "--------------------------------------------------操作时间：`date`--------------------------------------------------------------" >> ${module_tmp_dir}/tag_commit_all.info
        #git log --pretty=format:"%h - %an, %ar : %s" >> ${module_tmp_dir}/tag_commit_all.info
        # 展开显示每次提交的内容差异，用 -2 则仅显示最近的两次更新
        git log -p -1 >> ${module_tmp_dir}/tag_commit_all.info

        # 删除已经存在的本地标签
        echo "删除已经存在的本地标签"
        git tag -d ${next_tag_name}
        # 删除已经存在的远程仓库标签
        echo "删除已经存在的远程仓库标签"
        git push origin :${next_tag_name}
    fi

    echo "执行git tag ${next_tag_name}命令,给分支${use_branch_name}打上发布标签"

   
    if [ ${VERSION_COUNT} -gt 1 ]
    then
        #创建新的标签前，切换上次部署标签位置再打上新的标签，避免代码遗漏
        echo "创建新的标签前，切换到上次部署标签：${previous_tag_name}的位置，再打上新的标签：${next_tag_name}，避免代码遗漏"
        git reset --hard ${previous_tag_name}
        git pull
    fi

    git tag  ${next_tag_name}
    echo "推送本地新的标签到远程仓库"
    git push origin ${next_tag_name}

    echo -e "\n给指定分支"${use_branch_name}"打标签 结束" 
    # 打印空行，分割模块
    echo -e '----------------------------------------------------------------------------------------------------------------------------------------\n'
done